gestureswipe: Count last event when calculating velocity
authorAlexander Mikhaylenko <alexm@gnome.org>
Mon, 19 Oct 2020 09:13:56 +0000 (14:13 +0500)
committerAlexander Mikhaylenko <alexm@gnome.org>
Wed, 21 Oct 2020 15:59:15 +0000 (20:59 +0500)
The last event, matching lifting the finger/releasing the mouse button,
is important when there's a large delay between it and the previous events,
as in when performing a movement, stopping, then releasing fingers as
opposed to doing a swipe.

If this event is skipped, doing this will result in kinetic deceleration
matching the previous finger movement, while the expected behavior would
be no deceleration.

See also 5dc6194b98792d937c648835cfadbe64977db443 for a similar fix in
GtkEventControllerScroll.

gtk/gtkgestureswipe.c

index 59c7aba8073101d02b06a2ddf29461eac245313e..56de01c221e84ff2023a250990842a12a13af31b 100644 (file)
@@ -130,17 +130,16 @@ _gtk_gesture_swipe_clear_backlog (GtkGestureSwipe *gesture,
 }
 
 static void
-gtk_gesture_swipe_update (GtkGesture       *gesture,
-                          GdkEventSequence *sequence)
+gtk_gesture_swipe_append_event (GtkGestureSwipe  *swipe,
+                                GdkEventSequence *sequence)
 {
-  GtkGestureSwipe *swipe = GTK_GESTURE_SWIPE (gesture);
   GtkGestureSwipePrivate *priv;
   EventData new;
   double x, y;
 
   priv = gtk_gesture_swipe_get_instance_private (swipe);
-  _gtk_gesture_get_last_update_time (gesture, sequence, &new.evtime);
-  gtk_gesture_get_point (gesture, sequence, &x, &y);
+  _gtk_gesture_get_last_update_time (GTK_GESTURE (swipe), sequence, &new.evtime);
+  gtk_gesture_get_point (GTK_GESTURE (swipe), sequence, &x, &y);
 
   new.x = x;
   new.y = y;
@@ -149,6 +148,15 @@ gtk_gesture_swipe_update (GtkGesture       *gesture,
   g_array_append_val (priv->events, new);
 }
 
+static void
+gtk_gesture_swipe_update (GtkGesture       *gesture,
+                          GdkEventSequence *sequence)
+{
+  GtkGestureSwipe *swipe = GTK_GESTURE_SWIPE (gesture);
+
+  gtk_gesture_swipe_append_event (swipe, sequence);
+}
+
 static void
 _gtk_gesture_swipe_calculate_velocity (GtkGestureSwipe *gesture,
                                        double          *velocity_x,
@@ -202,6 +210,8 @@ gtk_gesture_swipe_end (GtkGesture       *gesture,
   if (gtk_gesture_is_active (gesture))
     return;
 
+  gtk_gesture_swipe_append_event (swipe, sequence);
+
   priv = gtk_gesture_swipe_get_instance_private (swipe);
   _gtk_gesture_swipe_calculate_velocity (swipe, &velocity_x, &velocity_y);
   g_signal_emit (gesture, signals[SWIPE], 0, velocity_x, velocity_y);